﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Security.Cryptography;

namespace FrbaCommerce.Login
{
    public partial class FormLogin : Form
    {

        private int intentosFallidos;
        private FormMenuPrincipal menuAnterior;
        


        public FormLogin(FormMenuPrincipal anterior)
        {
            InitializeComponent();
            this.menuAnterior = anterior;
        }


        //Click en el botón ingresar
        private void buttonLogin_Click(object sender, EventArgs e)
        {
            Codigo_reutilizable.PasswordHash password = new FrbaCommerce.Codigo_reutilizable.PasswordHash();
            string passDb = password.getDbPasswd(textBoxUsuario.Text);
            string passTextBox = password.getHashedPasswd(textBoxPW.Text);

            if (passDb == passTextBox)
            {

                //Me fijo que el usuario este habilitado!
                SqlConnection con = Program.obtenerConexion();

                SqlCommand checkHab = new SqlCommand("SELECT usr_habilitado FROM Monkey_Coders.Usuarios WHERE usr_name = '" + textBoxUsuario.Text + "'", con);
                if (Convert.ToInt32(checkHab.ExecuteScalar()) == 0)
                {
                    MessageBox.Show("El Usuario se encuentra DESHABILITADO", "Error",
                     MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }


                //Si la password era la default (1234) inhabilitamos al usuario
                if (textBoxPW.Text == "1234")
                {
                    MessageBox.Show("La seguridad de la contraseña es muy baja, por favor cambiela desde el boton \"Cambiar Contraseña\". \n En caso de no hacerlo su usuario sera Inhabilitado", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    SqlCommand desHab = new SqlCommand("UPDATE Monkey_Coders.Usuarios SET usr_habilitado = 0 WHERE usr_name = '" + textBoxUsuario.Text + "'", con);
                    desHab.ExecuteNonQuery();
                }
                //int roles =getRoles(username_textbox.Text,conString);
                List<string> roles = getRoles(textBoxUsuario.Text);
                LoginAs loginRoles = new LoginAs(roles, this.menuAnterior, this.textBoxUsuario.Text);

               
                if (roles.Count > 1)
                {
                    loginRoles.Show();
                }
                else
                {
                    menuAnterior.procesarLogin(roles.First(),this.textBoxUsuario.Text,this);
                }
                this.Hide();

            }
            else
            {
                MessageBox.Show("La contraseña es inválida, ingrese nuevamente");
                this.intentosFallidos++;
                if (this.intentosFallidos == 3)
                {
                    this.menuAnterior.desactivarLogin();
                    this.Close();
                }

            }
        }

        private List<string> getRoles(string username)
        {
            List<string> listResults = new List<string>();

            string consulta = "SELECT rol_nombre from [Monkey_Coders].Roles, [Monkey_Coders].usuario_rol, [Monkey_Coders].Usuarios"
            + " WHERE usr_name = '" + textBoxUsuario.Text
            + "' AND usuario_id = ur_user_id"
            + " AND ur_rol_id = rol_id";

            using (SqlConnection conn = Program.obtenerConexion())
            {

                SqlCommand cmd = new SqlCommand(consulta, conn);
                
                try
                {
                    SqlDataReader lector = cmd.ExecuteReader();

                    if (lector.HasRows)
                    {
                        while (lector.Read())
                        {
                            listResults.Add((string)lector["rol_nombre"]);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                finally
                {
                    // cerramos la conexion
                    if (conn.State != ConnectionState.Closed)
                        conn.Close();
                    // destruimos la conexion
                    conn.Dispose();
                }
            }
            return listResults;
        }

        private void buttonExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void FormLogin_Load(object sender, EventArgs e)
        {

        }


        public void salir()
        {
            this.Close();
        }


    }
}
